package TankGame;

// 该类继承自Tank类
// 用于表示敌方坦克，除了继承自父类的属性和方法外，还包含了敌方坦克的血量、射击状态、移动方向等属性和相应的操作方法。
// 运用了 Java 的继承和多态性等面向对象编程的特性。

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.io.Serializable;

// EnemyTank类表示敌方坦克，继承自Tank类，具有自己的血量、方向和射击状态等属性及相关方法
public class EnemyTank extends Tank implements Serializable {
    private int health;
    private Direction direction;
    private boolean canShoot = true;

    // 定义敌方坦克的移动方向枚举类型
    public enum Direction {
        UP, DOWN, LEFT, RIGHT
    }

    // 构造函数，用于初始化敌方坦克的属性
    public EnemyTank(int startX, int startY, int health) {
        super(startX, startY);
        this.health = health;
        // 随机设置敌方坦克的初始移动方向
        this.direction = Direction.values()[new Random().nextInt(Direction.values().length)];
    }

    // 获取敌方坦克的血量
    public int getHealth() {
        return health;
    }

    // 敌方坦克受到伤害时调用此方法，减少其血量
    public void takeDamage(int damage) {
        health -= damage;
    }

    // 判断敌方坦克是否被摧毁，若血量小于等于0则设置射击状态为false并返回true
    public boolean isDestroyed() {
        boolean destroyed = health <= 0;
        if (destroyed) {
            canShoot = false;
        }
        return destroyed;
    }

    // 获取敌方坦克的移动方向
    public Direction getDirection() {
        return direction;
    }

    // 设置敌方坦克的移动方向
    public void setDirection(Direction direction) {
        this.direction = direction;
    }

    // 重写父类的绘制方法，根据是否被摧毁绘制不同的图形，未摧毁时绘制红色矩形表示坦克和绿色矩形表示血量条
    @Override
    public void draw(Graphics2D g) {
        if (isDestroyed()) {
            return;
        }
        g.setColor(Color.RED);
        g.fillRect(x, y, 50, 50);

        // 绘制血量条
        g.setColor(Color.GREEN);
        g.fillRect(x, y - 10, (int) (50 * ((double) health / 100)), 5);
        g.setColor(Color.BLACK);
        g.drawRect(x, y - 10, 50, 5);
    }

    // 敌方坦克射击的方法，若可以射击则创建并返回一颗子弹，同时设置射击状态为false
    public Bullet shoot() {
        if (canShoot) {
            canShoot = false;
            Random random = new Random();
            int offsetX = random.nextInt(100) - 50;
            int offsetY = random.nextInt(100) - 50;
            int bulletX = x + 25 + offsetX;
            int bulletY = y + 25 + offsetY;
            double angle = Math.atan2(offsetY, offsetX);
            return new Bullet(bulletX, bulletY, angle, false);
        }
        return null;
    }

    // 重置敌方坦克的射击状态为true
    public void resetShooting() {
        canShoot = true;
    }
}
